#include "DesplazadorColumna.h"
#include "AparecedorFicha.h"
#include <list>

DesplazadorColumna::DesplazadorColumna(std::list<Json::Value> *tableros,
                                       VistaEscenario *vistaFichas, Mutex *m) {
    this->vistaEscenario = vistaFichas;
    this->m = m;
    this->tableros = tableros;
    this->aparecedor_fichas=NULL;
}
void *DesplazadorColumna::run() {

    Json::Value fichasACaer = tableros->front();
    Json::Value fichaCaer;
    tableros->pop_front();

    int x, y;

    int fichasBajando, desplazamiento;

    fichasBajando = fichasACaer.size();

    while (fichasBajando > 0) {
        for (int j = 0; j < 53; j++) {
            for (unsigned int i = 0; i < fichasACaer.size(); i++) {
                fichaCaer = fichasACaer[i];
                m->lock();
                if (fichaCaer["desplazamiento"].asInt() > 0 && j % 2 == 0) {
                    x = fichaCaer["x"].asInt();
                    y = fichaCaer["y"].asInt();

                    if (j != 52) {
                        vistaEscenario->vistaFichas[x][y]->xDesde += 2;
                    } else {
                        vistaEscenario->vistaFichas[x][y]->xDesde += 1;
                    }
                }
                m->unlock();
            }
            usleep(TIEMPO_DE_REFRESCO*1000);
        }

        /* Descuenta una unidad a cada ficha que cayó */
        for (unsigned int i = 0; i < fichasACaer.size(); i++) {
            desplazamiento = fichasACaer[i]["desplazamiento"].asInt();
            desplazamiento--;
            fichasACaer[i]["desplazamiento"] = desplazamiento;

            if (desplazamiento == 0) {
                fichasBajando--;
            }
        }
    }

    /* Desplaza las fichas hacia abajo en la matriz */
    int x_cae;
    int y_cae;
    for (int i = (fichasACaer.size() - 1); i >= 0 ; i--) {
        m->lock();
        x_cae=fichasACaer[i]["x"].asInt();
        y_cae=fichasACaer[i]["y"].asInt();
        desplazamiento = fichasACaer[i]["desplazamientoAux"].asInt();

        x = desplazamiento + fichasACaer[i]["x"].asInt();
        y = fichasACaer[i]["y"].asInt();

        vistaEscenario->vistaFichas[x][y] =
            vistaEscenario->vistaFichas[x_cae][y_cae];
        vistaEscenario->vistaFichas[x_cae][y_cae]=NULL;
        m->unlock();
    }

    this->aparecedor_fichas = new AparecedorFicha(tableros, vistaEscenario, m);
    this->aparecedor_fichas->start();

    this->aparecedor_fichas->join();
    this->exit();
    return NULL;
}

DesplazadorColumna::~DesplazadorColumna() {
    if (this->aparecedor_fichas!=NULL){
        Log::loguear(MDEBUG,"Liberando aparecedor de fichas (3/4)...");
        delete this->aparecedor_fichas;
        this->aparecedor_fichas=NULL;
    }
}
